package DAO;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;
import java.util.Date;


import BD.AlunoBD;
import BD.TurmaAlunoDisciplinaBD;
import ConexaoBackupBD.ConexaoBD;
import ConexaoBackupBD.MetodosVerificacaoBD;

public class AlunoDAO {
    
    //Para conexão com o banco de dados
    ConexaoBD conBD = new ConexaoBD();
    
    ConexaoBD BDraiz = new ConexaoBD();
    
    //Utilizado para campos unique
    MetodosVerificacaoBD metBD = new MetodosVerificacaoBD();
    
    Statement BDAluno;
    ResultSet rs;
    
    public String dataIngressoAluno(int raAluno) throws SQLException{
        String dataIngresso = "";
        Connection con = conBD.conectar();
            
            BDAluno = con.createStatement();
            rs = BDAluno.executeQuery("select dataingresso_al from aluno "
                    + " where ra_al = " + raAluno);
            
            if (rs != null) { 
                while (rs.next()) { 
                    //al.setCodigo(auxiliar.getInt("cod_al"));
                    dataIngresso = rs.getString("dataingresso_al");
                }
            }
            return dataIngresso;
    }
    
    public boolean inserirAluno(AlunoBD alu){ 
        try
        {
            Connection con = conBD.conectar();
            boolean vcpf, vra;
            
            //verifica cpf e ra duplicados => False: Está duplicado, True: Não duplicado
            vcpf = metBD.unique("aluno", "cpf_al", alu.getCpf());
            vra = metBD.unique("aluno", "ra_al", String.valueOf(alu.getRa()));
            
            if( vcpf && vra ){ // Ra e CPF (verdadeiros) não Duplicado
                BDAluno = con.createStatement();    
                
                
                //Inserirndo no Banco de Dados.blo
                BDAluno.execute("INSERT INTO aluno VALUES('"+alu.getRa()+"', '"+alu.getSexo()+"', "
                        + " '"+alu.getNome()+"', '"+alu.getCpf()+"', "
                        + " '"+alu.getTelefone()+"','"+alu.getCelular()+"',"
                        + " '"+alu.getBolsista()+"','"+alu.getDataIngresso()+"',"
                        + " '"+alu.getEmail()+"', '"+alu.getCodProfessor()+"', "
                        + " '"+alu.getCodCurso()+"', '"+alu.getDocRG()+"',"
                        + " '"+alu.getDocCPF()+"','"+alu.getDocCertidao()+"',"
                        + " '"+alu.getDocTitulo()+"', '"+alu.getDocCurriculum()+"',"
                        + " '"+alu.getDocFoto()+"','"+alu.getDocCarta()+"',"
                        + " '"+alu.getDocHistorico()+"','"+alu.getDocDiploma()+"',"
                        + " '"+alu.getDocCertificado()+"','"+alu.getPossuiOutrosDocumentos()+"',"
                        + " '"+alu.getOutrosDocsEntregues()+"','"+alu.getObservacoes()+"',"
                        + " '"+alu.getDocOK()+"');");	
                                
                JOptionPane.showMessageDialog(null,"Cadastro realizado com sucesso!",
                        "Cadastro", JOptionPane.INFORMATION_MESSAGE);

                con.close();
                return true;
            }
            else{
                if(vcpf == false && vra == true){//somente cpf dupliado
                    JOptionPane.showMessageDialog(null,"CPF já existe", 
                            "CPF duplicado no banco de dados", 
                            JOptionPane.ERROR_MESSAGE);
                }
                else{
                    if(vcpf == true && vra == false){//somente ra duplicado
                        JOptionPane.showMessageDialog(null,"RA já existe", 
                                "RA duplicado no banco de dados", 
                                JOptionPane.ERROR_MESSAGE);
                    }
                    else //Ra e CPF duplicados
                    {
                        JOptionPane.showMessageDialog(null,"RA e CPF já existem",
                                "RA e CPF duplicados no banco de dados", 
                                JOptionPane.ERROR_MESSAGE);
                    }
                }
                con.close();
                return false;
            }
        }
        catch (SQLException ex) {
            JOptionPane.showMessageDialog(null,ex.getMessage(),
                    "Erro no banco", JOptionPane.ERROR_MESSAGE);
        }         
        return false;
    }
  
    public List<AlunoBD> filtro(String campo, String valor) {      
       List<AlunoBD> listaFiltro = new ArrayList<AlunoBD>();
       try { 
            Connection con = conBD.conectar();
            
            BDAluno = con.createStatement();
            rs = BDAluno.executeQuery("select a.ra_al, a.sexo_al, a.nome_al, a.cpf_al, "
                    + " a.tel_al, a.cel_al, a.bolsista_al, a.dataingresso_al, "
                    + " a.email_al, a.cod_prof, a.cod_curso, "
                    + " a.docrg_al, a.doccpf_al, a.doccertidao_al, "
                    + " a.doctituloeleitor_al, a.doccurriculum_al, a.docfoto_al, "
                    + " a.doccarta_al, a.dochistorico_al, a.docdiploma_al, "
                    + " a.doccertificadomilitar_al, a.chkoutrosDocs, a.outrosdocsentregues, "
                    + " a.observacoes, a.docok_al, "
                    + " c.nome_curso "
                    + " from aluno a, curso c "
                    + " where a.cod_curso = c.cod_curso and "
                    + " "+campo+" like '" + valor + "%'"
                    + " order by(a.nome_al) ");
            
            if (rs != null) { 
                while (rs.next()) { 
                    AlunoBD al = new AlunoBD();
                    //al.setCodigo(auxiliar.getInt("cod_al"));
                    al.setRa(rs.getInt("ra_al"));
                    al.setSexo(rs.getString("sexo_al"));
                    al.setNome(rs.getString("nome_al"));
                    al.setCpf(rs.getString("cpf_al"));
                    al.setTelefone(rs.getString("tel_al"));
                    al.setCelular(rs.getString("cel_al"));
                    al.setBolsista(rs.getString("bolsista_al"));
                    al.setDataIngresso(metBD.convDataBra(rs.getString("dataingresso_al")));
                    al.setEmail(rs.getString("email_al"));
                    
                    //se o código veio diferente de -1, buscar o código e o nome do professor
                    if(rs.getInt("a.cod_prof") != -1){
                         BDAluno = con.createStatement();
                         ResultSet newResult = BDAluno.executeQuery("SELECT p.cod_prof, p.nome_prof "
                            + " From professor p where p.cod_prof = '"+rs.getInt("a.cod_prof")+"' " );
                         newResult.first();
                         al.setCodProfessor(newResult.getInt("p.cod_prof"));
                         al.setNomeProfessorAux(newResult.getString("p.nome_prof"));
                    }else{
                         al.setCodProfessor(-1);
                         al.setNomeProfessorAux("");
                    }
                    
                    al.setCodCurso(rs.getInt("a.cod_curso"));
                    
                    al.setNomeCursoAux(rs.getString("nome_curso"));

                    //CheckBox's dos documentos
                    al.setDocRG(rs.getString("docrg_al"));
                    al.setDocCPF(rs.getString("doccpf_al"));
                    al.setDocCertidao(rs.getString("doccertidao_al"));
                    al.setDocTitulo(rs.getString("doctituloeleitor_al"));
                    al.setDocCurriculum(rs.getString("doccurriculum_al"));
                    al.setDocFoto(rs.getString("docfoto_al"));
                    al.setDocCarta(rs.getString("doccarta_al"));
                    al.setDocHistorico(rs.getString("dochistorico_al"));
                    al.setDocDiploma(rs.getString("docdiploma_al"));
                    al.setDocCertificado(rs.getString("doccertificadomilitar_al"));
                    al.setPossuiOutrosDocumentos(rs.getString("chkoutrosDocs"));
                    al.setOutrosDocsEntregues(rs.getString("outrosdocsentregues"));
                    al.setObservacoes(rs.getString("observacoes"));

                    //Adiciona aluno na lista de Alunos
                    listaFiltro.add(al); 
                }
                con.close();
                return listaFiltro; 
          }else { 
                return null; 
          } 
        } catch (SQLException e) { 
            return null; 
        } 
    }    
      
    public boolean alterarAluno(AlunoBD al){

        String sql = "update aluno set sexo_al = ?, nome_al = ?, cpf_al = ?, tel_al = ?, cel_al = ?,"
                + " bolsista_al = ?, dataingresso_al = ?, email_al = ?, cod_prof = ?, "
                + " cod_curso = ?, docrg_al = ?, doccpf_al = ?, doccertidao_al = ?, doctituloeleitor_al = ?, "
                + " doccurriculum_al = ?, docfoto_al = ?, doccarta_al = ?, dochistorico_al = ?, "
                + " docdiploma_al = ?, doccertificadomilitar_al = ?, chkoutrosdocs = ? ,"
                + " outrosdocsentregues = ?, observacoes = ?, docok_al = ?";
        sql += " where ra_al = ?";   

        try {
            // obtem conexão
            Connection con = conBD.conectar();

            //Obtem o cpf do aluno e compara com o  
            //que foi ENVIADO para alteração (al.get = o que o usuario digitou)
            // SELECT ira obter o atual para aquele codigo
            BDAluno = con.createStatement();
            rs = BDAluno.executeQuery("SELECT cpf_al from "
                    + " aluno where ra_al = '"+al.getRa()+"'");
            rs.first();
            String capturaCpf= rs.getString("cpf_al");

            if(metBD.unique("aluno", "cpf_al", al.getCpf()) || capturaCpf.equals(al.getCpf())){ // Deixa Cadastrar se usuario manteve o mesmo cpf
                    PreparedStatement ps = con.prepareStatement(sql);
                    //seta as strings no lugar dos '?'.    
                    ps.setString(1, al.getSexo());   
                    ps.setString(2, al.getNome());                    
                    ps.setString(3, al.getCpf());
                    ps.setString(4, al.getTelefone());
                    ps.setString(5, al.getCelular());
                    ps.setString(6, al.getBolsista());
                    ps.setString(7, al.getDataIngresso());
                    ps.setString(8, al.getEmail());
                    ps.setString(9, (String.valueOf(al.getCodProfessor())));
                    ps.setString(10, (String.valueOf(al.getCodCurso())));
                    ps.setString(11, al.getDocRG());
                    ps.setString(12, al.getDocCPF());
                    ps.setString(13, al.getDocCertidao());
                    ps.setString(14, al.getDocTitulo());
                    ps.setString(15, al.getDocCurriculum());
                    ps.setString(16, al.getDocFoto());
                    ps.setString(17, al.getDocCarta());
                    ps.setString(18, al.getDocHistorico());
                    ps.setString(19, al.getDocDiploma());
                    ps.setString(20, al.getDocCertificado());
                    ps.setString(21, al.getPossuiOutrosDocumentos());
                    ps.setString(22, al.getOutrosDocsEntregues());
                    ps.setString(23, al.getObservacoes());
                    ps.setString(24, (String.valueOf(al.getDocOK())));
                    ps.setString(25, (String.valueOf(al.getRa())));
                    
                    if (ps.executeUpdate() > 0) {
                        JOptionPane.showMessageDialog(null,"Alteração realizada com sucesso",
                                "Alterar", JOptionPane.INFORMATION_MESSAGE);
                        con.close();
                        return true;
                    } else {
                        JOptionPane.showMessageDialog(null,"Não foi possível realizar a alteração",
                                "Erro em alterar", JOptionPane.ERROR_MESSAGE);
                        con.close();
                    return false;
                    }
            }
            else{
                JOptionPane.showMessageDialog(null,"Cpf já existe",
                        "Cpf duplicado", JOptionPane.INFORMATION_MESSAGE);
                return false;                   
            }
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null,"Não foi possível conectar ao banco",
                    "Erro no banco", JOptionPane.ERROR_MESSAGE);
            return false;
        }  
   }
  
   public boolean excluirAluno(AlunoBD al){
        String sql = "delete from aluno where ra_al = ?";
        try {
            //Abre conexão
            Connection con = conBD.conectar();
            PreparedStatement ps = con.prepareStatement(sql);
            
            //verificar se aluno é foreign key da relação turma-aluno-disciplina e tese
            BDAluno = con.createStatement();
            rs = BDAluno.executeQuery(" SELECT count(ra_al) as qtddisciplina "
                    + " from turmaalunodisciplina "
                    + " where ra_al = '"+al.getRa()+"' ");
            rs.first();  
            int capturaDisciplinas = rs.getInt("qtddisciplina");
            
            rs = BDAluno.executeQuery(" SELECT count(ra_al) as qtdtese from tese "
                    + " where ra_al = '"+al.getRa()+"' ");
            rs.first();  
            int capturaTese = rs.getInt("qtdtese");
 
            if(capturaDisciplinas >= 1 && capturaTese >= 1){
                JOptionPane.showMessageDialog(null,"Aluno cadastrado em uma ou "
                        + "mais disciplinas e possuí tese cadastrada, não pode ser excluído", 
                        "Excluir", JOptionPane.INFORMATION_MESSAGE);
                con.close();
                return false;                   
            }else{
                if(capturaDisciplinas >= 1){
                    JOptionPane.showMessageDialog(null,"Aluno cadastrado em uma ou "
                        + "mais disciplinas, não pode ser excluído", 
                        "Excluir", JOptionPane.INFORMATION_MESSAGE);
                    con.close();
                    return false;
                }else{
                    if(capturaTese >= 1){
                        JOptionPane.showMessageDialog(null,"Aluno possuí tese cadastrada, não pode ser excluído", 
                            "Excluir", JOptionPane.INFORMATION_MESSAGE);
                        con.close();
                        return false;
                    }else{            
                        //seta a string no lugar do '?' com o codigo enviado
                        ps.setString(1, (String.valueOf(al.getRa())));
                        if (ps.executeUpdate() > 0) {
                            //retorna true se conseguiu realizar a alteração
                            con.close();
                            return true;
                        } else {
                            //retorna false se não conseguiu realizar a alteração
                            con.close();
                            return false;
                        }
                    }
                }
            }        
        }catch (SQLException e) {
            // Erro se não conseguir conectar ao banco
             JOptionPane.showMessageDialog(null,e.getMessage(), 
             "Erro no banco", JOptionPane.ERROR_MESSAGE);
             return false;
        }
   }
   
   
   
}
